package com.soo.hoo.admin.service;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import com.soo.hoo.admin.model.dto.FileDTO;
import com.soo.hoo.admin.model.dto.ImageFileDTO;
import com.soo.hoo.admin.model.entity.SysFile;
import com.soo.hoo.core.service.IService;
import jakarta.annotation.Nullable;
import org.springframework.web.multipart.MultipartFile;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * <p>文件服务接口</p>
 *
 * @author 杨燚
 * @since 2023/6/18
 */
public interface FileService extends IService<SysFile> {

    /**
     * 上传文件
     *
     * @param file   文件
     * @param module 模块
     * @return 上传后的信息
     */
    FileDTO upload(MultipartFile file, @Nullable String module);

    /**
     * 上传文件
     *
     * @param imageFile 图片文件
     * @param module    模块
     * @return 上传后的信息
     */
    ImageFileDTO uploadImage(MultipartFile imageFile, @Nullable String module);

    /**
     * 批量上传
     *
     * @param files  文件列表
     * @param module 模块
     * @return 上传后的信息
     */
    List<FileDTO> upload(List<MultipartFile> files, String module);

    /**
     * 批量上传
     *
     * @param files  文件列表
     * @param module 模块
     * @return 上传后的信息
     */
    List<ImageFileDTO> uploadImage(List<MultipartFile> files, String module);

    /**
     * 移除文件
     *
     * @param id 文件id
     */
    default void removeFile(Long id) {
        removeFile(ListUtil.of(id));
    }

    /**
     * 批量移除文件
     *
     * @param ids 文件id列表
     */
    void removeFile(Collection<Long> ids);

    /**
     * 获取文件信息
     *
     * @param id 文件id
     * @return 文件信息
     */
    default FileDTO getFileInfo(Long id) {
        List<FileDTO> fileInfo = getFileInfo(ListUtil.of(id));
        if (CollUtil.isNotEmpty(fileInfo)) {
            return fileInfo.get(0);
        }
        return null;
    }

    /**
     * 获取文件信息
     *
     * @param ids 文件ids
     * @return 文件信息
     */
    List<FileDTO> getFileInfo(List<Long> ids);

    /**
     * 获取图片文件信息
     *
     * @param ids 图片文件ids
     * @return 图片文件信息
     */
    List<ImageFileDTO> getImageFileInfo(List<Long> ids);

    /**
     * 获取图片文件信息map
     *
     * @param ids 图片文件ids
     * @return 图片文件信息
     */
    Map<Long, ImageFileDTO> getImageFileInfoMap(List<Long> ids);
}
